package leetcode.hot100;

import leetcode.common.ListNode;

import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;

@SuppressWarnings("all")
public class _23_合并K个升序链表 {

    // 链表数组 lists = [[1,4,5],[1,3,4],[2,6]] 合并后为 [1,1,2,3,4,4,5,6]
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) return null;
        // 将链表以从小到大的顺序存入优先级队列中
        PriorityQueue<ListNode> queue = new PriorityQueue<>(new Comparator<ListNode>() {
            @Override
            public int compare(ListNode o1, ListNode o2) {
                return o1.val - o2.val;
            }
        });
        // 初始化优先级队列，忽略空链表
        for (ListNode list : lists) {
            if (list != null) {
                queue.add(list);
            }
        }
        // 创建一条全选的链表来存储合并后的链表结果
        ListNode dummyNode = new ListNode(0);
        ListNode node = dummyNode;
        while (!queue.isEmpty()) {
            ListNode listNode = queue.poll();
            node.next = listNode;
            node = node.next;
            // 当前链表头被加入新链表后，将该链表剩余部分重新存入优先级队列排序
            listNode = listNode.next;
            if (listNode != null) {
                queue.add(listNode);
            }
        }
        return dummyNode.next;
    }
}
